(function($){
//弹幕系统的js
		/*
			必须要的参数 container:容器必须是非jquery对象
			messageQueue :消息队列 {queue,limit}
			commonMessagePro 作为一些其他配置需要的暂时有{fontSize}
		*/
		var DanMu = function(etc){
			if(this == window){
				return new DanMu(etc);
			}
			if(etc.container!=null){
				this.container = etc.container;
			}else if(this.scopeWidth!=null&&this.scopeHeight !=null){
				this.scopeWidth = etc.width;
				this.scopeHeight = etc.height;
			}else{
				throw "必须包含container或者scopWith属性";
			}
			//消息队列为一个js 数组
			this.messageQueue = etc.messageQueue.queue;
			//限制队列中最多的消息数量,如果超过那么给服务器发送定量请求不发或者少发消息
			this.limit = etc.messageQueue.limit;
			this.commonMessagePro = etc.commonMessagePro;
		}
		DanMu.Message = function(arg){
			this.color = arg.color;
			this.message = arg.message;
			this.speed = arg.speed;
			this.offset = arg.offset;
		}
		DanMu.prototype = {
			fontSizeNum:-1,
			pauseDanmu:function(){

			},
			startDanmu:function(){

			},
			closeDanmu:function(){

			},
			messageShowView:function(){
				var $container = $(this.container);
				var position = $container.position();
				var width =$container.width();
				var height = $container.height();
				/*根据弹出小心的容量计算出消息的数量从而显示*/
				var arr = this._shiftMessages(this._caculateMessageNumber());
				/*这块代码可以优化   全部完成后在给*/
				for(index in arr){
					var $message = $('<span>'+arr[index].message+'</span>').css({
						position:'absolute',
						left:position.left-arr[index].offset+'px',
						top:index*(this.fontSizeNum)+'px',
						color:arr[index].color,
						font:this.commonMessagePro.fontSize+" bolder '微软雅黑' "
					});
					$container.append($message);
					$message.animate({left:'+1000px'},arr[index].speed,function(){
						$message.empty();
						$message.remove();
					});
				}
			},
			/*推入信息*/
			pushMessage:function(message){
				console.log(message);
				if(this.messageQueue!=null&&this.messageQueue.length<this.limit){
					this.messageQueue.push(message); 
				}else if(this.messageQueue.length>=limit){
					/*去远端访问通知尽量少的弹幕来*/
				}
			},
			 _messageMove:function(arr){
			 	
			},
			/*弹出信息*/
			_shiftMessage:function(){
				if(this.messageQueue!=null&&this.messageQueue.length!=0){
					return this.messageQueue.shift();
				}
			},
			_shiftMessages:function(number){
				var arr = [];
				if(this.messageQueue!=null){
					if(this.messageQueue.length>=number){
						for(var i=0;i<number;i++){
							arr.push(this.messageQueue.shift());
						}
					}else {
						// console.log("length:"+this.messageQueue.length)
						while(this.messageQueue.length!=0){
							arr.push(this.messageQueue.shift());
						}
					}
				}
				return arr;
			},
			/*根据容器宽度计算每次弹幕出来的请求量*/
			_caculateMessageNumber:function(){
				var innerWidth = $(this.container).width();
				var fontWidth = this.commonMessagePro.fontSize;
				if(this.fontSizeNum==-1){
					this.fontSizeNum = parseInt(fontWidth.substring(0,fontWidth.indexOf("px")));
				}
				return Math.floor(innerWidth/this.fontSizeNum);
			}
		}
		
		/*
			必须要的参数 container:容器必须是非jquery对象
			messageQueue :消息队列 {queue,limit}
			commonMessagePro 作为一些其他配置需要的暂时有{fontSize}
		*/
		DanMu.defaults = {
			container:$("#danmu_shoot"),
			messageQueue:{
				queue:[],
				limit:500
			},
			commonMessagePro:{
				fontSize:'20px'
			}
		}
		/*主要流程第一个进来的时候需要传递参数new好对象DanMu
		  将其绑定给this上的data 然后第二次进来的时候是访问函数的时候
		  先取得data上的danmu对象然后将需要的函数的值传递给他
		*/
		var Pugin =function(option,arg){
			//这里是new好一个对象的时候 给对象传递参数  将对象给予data数据绑定
			var options = $.extend({}, DanMu.defaults, typeof option == 'object' && option);
			//注意这里如果是Pugin对象  给扩展的那么到时候this是一个jquery对象   是一个jquery对象中包含所有的数组值
			//这样就可以把每一个值进行遍历
			if(option=='message'){
				return new DanMu.Message(arg);
			}
			return this.each(function(){
				var $this   = $(this);
				//如果是第一次这里会为空然后后面会绑定数据
				var data    = $this.data('danmu');
				//这里是看是否是需要函数如果是需要函数那么取得函数的名字
				var action = typeof option =='string'?option:NaN;
				if (!data) $this.data('danmu', (data = new DanMu(options)));
				//这里通过data[action] 去取得函数的名字然后传递参数给函数执行
				if(action) data[action](arg);
			})
		}
		$.fn.danmu = Pugin;
		$.fn.danmu.Constructor = DanMu;

})($);
			